package inutan.game.prop;

import inutan.common.message.ActionErrorEnum;
import inutan.data.Resource.Type;
import inutan.game.business.GameFlowContext;
import inutan.game.entity.UserInfo;
import inutan.game.entity.prop.BaseItemInfo;
import org.ricks.orm.OrmContext;
import java.util.List;
import java.util.Optional;

public class GoldOperate implements OperatePropInterface {
    @Override
    public List<BaseItemInfo> props(GameFlowContext context) {
        UserInfo userInfo = OrmContext.me().uniqueCacheLoad(UserInfo.class, context.getUserId()).get();
        return List.of(new BaseItemInfo(Type.GOLD, Type.GOLD, userInfo.getGold()));
    }

    @Override
    public void useProp(GameFlowContext context, List<BaseItemInfo> useItem) {
        UserInfo userInfo = OrmContext.me().uniqueCacheLoad(UserInfo.class,context.getUserId()).get();
        int amount = useItem.stream().mapToInt(x -> x.getCount()).sum();
        userInfo.setGold(userInfo.getGold() - amount);
        System.err.println("消耗金币：" + amount + " , 剩余金币：" + userInfo.getGold());
        OrmContext.me().update(userInfo);
    }

    @Override
    public List<BaseItemInfo> addProp(GameFlowContext context, List<BaseItemInfo> addProps) {
        int addGolds = addProps.stream().mapToInt(x -> x.getCount()).sum();
        UserInfo userInfo = OrmContext.me().uniqueCacheLoad(UserInfo.class,context.getUserId()).get();
        userInfo.setGold(userInfo.getGold() + addGolds);
        OrmContext.me().update(userInfo);
        return addProps;
    }

    @Override
    public boolean checkItemNum(GameFlowContext context, List<BaseItemInfo> props) {
        int amount = props.stream().mapToInt(x -> x.getCount()).sum();
        Optional<UserInfo> optionalUser = OrmContext.me().uniqueCacheLoad(UserInfo.class,context.getUserId());
        ActionErrorEnum.systemOtherErrCode.assertFalse(optionalUser.isEmpty(),"致命异常User load error ");
        return optionalUser.get().getGold() >= amount;
    }
}
